/**
 * 处理文件拖拽相关事件的函数，包括拖拽经过和拖拽离开事件。
 *
 * @param {Event} event - 拖拽事件对象
 */
function simpleKnowledgePanelDragEvent(event) {
    // 阻止事件的默认行为，防止浏览器对文件进行默认处理
    event.preventDefault();
    // 若事件类型为拖拽经过
    if (event.type === 'dragover') {
        // 若当前没有文件正在被拖拽
        if (!isFileDragging) {
            // 标记有文件正在被拖拽
            isFileDragging = true;
            // 为简单知识面板添加边框脉冲动画
            simpleKnowledgePanel.style.animation = 'border-pulse 4.0s infinite';
            // 显示文件导入覆盖层
            displayImportOverlay(simpleKnowledgePanel);
        }
    }
    // 若事件类型为拖拽离开
    else if (event.type === 'dragleave') {
        /** 获取与当前事件相关的目标元素 */
        const relatedTarget = event.relatedTarget;
        // 若相关目标元素不在简单知识面板内
        if (!simpleKnowledgePanel.contains(relatedTarget)) {
            // 标记没有文件正在被拖拽
            isFileDragging = false;
            // 移除简单知识面板上的所有样式，恢复初始状态
            simpleKnowledgePanel.removeAttribute('style');
            // 隐藏文件导入覆盖层
            displayImportOverlay(simpleKnowledgePanel, false);
        }
    }
};

/**
 * 处理文件拖拽放下事件的函数。
 * 当文件被拖拽到聊天历史面板并放下时，执行此函数。
 *
 * @param {DragEvent} event - 拖拽放下事件对象
 */
async function simpleKnowledgePanelDragAfterEvent(event) {
    // 阻止事件的默认行为，防止浏览器对文件进行默认处理
    event.preventDefault();
    // 移除简单知识面板上的所有附加样式，恢复初始状态
    simpleKnowledgePanel.removeAttribute('style');
    // 隐藏文件导入覆盖层
    displayImportOverlay(simpleKnowledgePanel, false);
    /** 获取通过拖拽传递的文件列表 */
    const files = event.dataTransfer.files;
    // 若文件列表为空，显示错误提示信息并终止函数执行
    if (!files.length) return showSystemMessage('请拖入有效的文本文件', 'error');
    /** 过滤出有效的文件列表，排除图片和视频文件 */
    const validFiles = Array.from(files).filter(file => !visionExtensions.includes(file.name.split('.').pop().toLowerCase()));
    /** 过滤出文件大小超过 10MB 的文件 */
    const oversizedFiles = validFiles.filter(file => file.size <= 10 * 1024 * 1024);
    // 若过滤后的文件列表为空，显示错误提示信息并终止函数执行
    if (!oversizedFiles.length) return showSystemMessage('请拖入有效的文本文件（文件大小不能超过 10MB 且 不能包含图片或视频文件）', 'error');
    /** 上传 oversizedFiles 中的文件到服务器 */
    const uploadPromises = oversizedFiles.map(file => saveFileWithFetch(file, ('knowledge/entry/' + file.name), true));
    // 等待所有文件上传完成
    await Promise.all(uploadPromises);
    // 清空容器内的现有内容
    simpleKnowledgePanel.innerHTML = '';
    // 处理 Knowledge 文件
    await processKnowledgeFiles();
    // 重新加载简单知识页面
    await loadPagesIntoWindow();
};

/**
 * 刷新知识库按钮点击事件
 *
 * 当用户点击刷新知识库按钮时，会触发此事件。
 * 事件处理函数会调用 processKnowledgeFiles 函数处理知识库文件，
 * 并在处理完成后重新加载简单知识页面。
 *
 */
async function knowledgeRefreshButtonClickEvent() {
    // 禁用刷新按钮
    knowledgeRefreshButton.disabled = true;
    // 清空容器内的现有内容
    simpleKnowledgePanel.innerHTML = '';
    // 处理 Knowledge 文件
    await processKnowledgeFiles();
    // 重新加载简单知识页面
    await loadPagesIntoWindow();
    // 启用刷新按钮
    knowledgeRefreshButton.disabled = false;
};

/**
 * 上传知识库按钮点击事件
 *
 * 当用户点击上传知识库按钮时，会触发此事件。
 * 事件处理函数会调用 uploadKnowledgeBase 函数上传知识库文件。
 *
 */
async function uploadKnowledgeBase() {
    /**
     * 获取用户输入的消息
     */
    const message = getUserMessage();
    // 若消息为空则直接返回
    if (!message) return;
    /**
     * 生成创建待处理的知识库文件的名称
     */
    const fileName = toBtoaString("knowledge/entry/" + RandomFloor(10000, 99999) + ".knowledge");
    /**
     * 发送 POST 请求创建待处理的知识库文件
     */
    const initResponse = await fetch('/save',
        {
            method: 'POST',
            headers: {
                'Content-Type': 'text/plain',
                'X-File-Name': fileName,
                'X-Overwrite': 'true'
            },
            body: message
        }
    );
    // 检查创建操作是否成功，失败则抛出错误
    if (!initResponse.ok) return showSystemMessage("文件上传失败", "error");
    // 清空容器内的现有内容
    simpleKnowledgePanel.innerHTML = '';
    // 处理 Knowledge 文件
    await processKnowledgeFiles();
    // 重新加载简单知识页面
    await loadPagesIntoWindow();
};